package com.sisbibvir.unmsm.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

import com.sisbibvir.unmsm.dao.HistorialasignaciontesiDAO;
import com.sisbibvir.unmsm.dao.JPAUtil;
import com.sisbibvir.unmsm.dao.LineaInvestigacionDAO;
import com.sisbibvir.unmsm.dao.ProfesorDAO;
import com.sisbibvir.unmsm.entidades.Alumno;
import com.sisbibvir.unmsm.entidades.Historialasignaciontesi;
import com.sisbibvir.unmsm.entidades.LineaDeInvestigacion;
import com.sisbibvir.unmsm.entidades.Profesor;
import com.sisbibvir.unmsm.entidades.Propuesta;
import com.sisbibvir.unmsm.entidades.Usuario;



@ManagedBean(name = "asignarpropuesta")
@SessionScoped

public class AsignarPropuestaController implements Serializable{
	

    private String selected_docente;
    private Propuesta selected_propuesta;
    private String selected_table="sdasas";
	private List<String> lineas;
	private List<String> docentes;
	private List<Propuesta> propuestas_docente;
	
	
	//Datos de la asignacion
	private Alumno participante1=null;
	private Alumno participante2=null;
	private Propuesta propuesta_asignada=null;
	private boolean elimina=false;
	 	
	//No va a la GUI
	private ArrayList<Profesor> profes=new ArrayList<Profesor>();;
	private LineaDeInvestigacion linea;
	
	//Auxiliares gui
	private String auxi=null;
	private int conta=0;
	
	
	

	

	

	public int getConta() {
		return conta;
	}

	public void setConta(int conta) {
		this.conta = conta;
	}

	public Alumno getParticipante1() {
		return participante1;
	}

	public void setParticipante1(Alumno participante1) {
		this.participante1 = participante1;
	}

	public Alumno getParticipante2() {
		return participante2;
	}

	public void setParticipante2(Alumno participante2) {
		this.participante2 = participante2;
	}

	public Propuesta getPropuesta_asignada() {
		return propuesta_asignada;
	}

	public void setPropuesta_asignada(Propuesta propuesta_asignada) {
		this.propuesta_asignada = propuesta_asignada;
	}

	public ArrayList<Profesor> getProfes() {
		return profes;
	}

	public void setProfes(ArrayList<Profesor> profes) {
		this.profes = profes;
	}

	public String getAuxi() {
		return auxi;
	}

	public void setAuxi(String auxi) {
		this.auxi = auxi;
	}

	public AsignarPropuestaController() {
		super();
		JPAUtil util =  new JPAUtil();
		LineaInvestigacionDAO dao =  new LineaInvestigacionDAO(util.getEntityManager());
		List<LineaDeInvestigacion> aux = dao.ListarBusqueda("");
		ProfesorDAO pdao =  new ProfesorDAO(util.getEntityManager());
		
		
		propuesta_asignada = null;
		participante1 = null;
		participante2 = null;
		selected_docente = null;
		selected_propuesta = null;
		selected_table = null;
		lineas =  new ArrayList<String>();
	
		for(int i=0;i<aux.size();i++){
			lineas.add(aux.get(i).getDescripcion());
		}
		
		LoginController myBean2 = (LoginController) FacesContext.getCurrentInstance().getExternalContext()
	            .getSessionMap().get("pc");
		try{
			propuesta_asignada = myBean2.user.getPropuestas().get(0);
		}catch(java.lang.ArrayIndexOutOfBoundsException e){
			propuesta_asignada=null;
		}
		
		if(propuesta_asignada!=null){
			participante1 = myBean2.user.getAlumnos().get(0);
			for(int j=0;j<propuesta_asignada.getUsuarios().size();j++){
				if(propuesta_asignada.getUsuarios().get(j)!=myBean2.user &&
						propuesta_asignada.getUsuarios().get(j).getTipoUsuario().getId()==3){
						participante2 = propuesta_asignada.getUsuarios().get(j).getAlumnos().get(0);
						int id1=0,id2=0;
						HistorialasignaciontesiDAO da =  new HistorialasignaciontesiDAO(util.getEntityManager());
						List<Historialasignaciontesi> historiales =  da.listarTodosxUsuario(participante1.getUsuarios().get(0)
								.getId());
						id1 = historiales.get(historiales.size()-1).getId();
						historiales = da.listarTodosxUsuario(participante2.getUsuarios().get(0).getId());
						id2 = historiales.get(historiales.size()-1).getId();
						
						if(id1<id2){
							elimina=true;
						}
				}
			}
		}
		
		
		
		
		util.getEntityManager().close();
		dao = null;
		System.gc();
	}

	public List<String> getLineas() {
		return lineas;
	}

	public void setLineas(List<String> lineas) {
		this.lineas = lineas;
	}

	
	public String getSelected_table() {
		return selected_table;
	}

	public void setSelected_table(String selected_table) {
		this.selected_table = selected_table;
	}  
    
	public void seleccionaLinea(){
		JPAUtil util =  new JPAUtil();
		LineaInvestigacionDAO dao =  new LineaInvestigacionDAO(util.getEntityManager());
		linea = dao.ListarBusqueda(""+selected_table).get(0);
		List<String> profesores =  new ArrayList<String>();
		List<Usuario> usuarios = new ArrayList<Usuario>();
		
		Profesor auxiliar;
		
		for(int i=0;i<linea.getPropuestas().size();i++){
			
			auxiliar = linea.getPropuestas().get(i).getUsuarios().get(0).getProfesors().get(0);
			
			if(!profesores.contains(auxiliar.getApellidoP() + " " +auxiliar.getApellidoM() + " " + auxiliar.getNombre())){
				profesores.add(auxiliar.getApellidoP() + " " +auxiliar.getApellidoM() + " " + auxiliar.getNombre());
				profes.add(auxiliar);
			}
			
		}
		
		docentes = profesores;
		selected_docente=null;
		if(propuestas_docente!=null){
			propuestas_docente.clear();
		}
		
		util.getEntityManager().close();
		dao = null;
		System.gc();
	}
	
	
	public String getSelected_docente() {
		return selected_docente;
	}

	public void setSelected_docente(String selected_docente) {
		this.selected_docente = selected_docente;
	}

	public List<String> getDocentes() {
		return docentes;
	}

	public void setDocentes(List<String> docentes) {
		this.docentes = docentes;
	}

		public Propuesta getSelected_propuesta() {
			return selected_propuesta;
		}

		public void setSelected_propuesta(Propuesta selected_propuesta) {
			this.selected_propuesta = selected_propuesta;
		}

		public List<Propuesta> getPropuestas_docente() {
			return propuestas_docente;
		}

		public void setPropuestas_docente(List<Propuesta> propuestas_docente) {
			this.propuestas_docente = propuestas_docente;
		}

		public void llenaTablaPropuestas(){
			selected_propuesta=null;
			JPAUtil util =  new JPAUtil();
			ProfesorDAO pdao =  new ProfesorDAO(util.getEntityManager());
			boolean encontrado=false;
			int i=0;
			if(selected_docente!=null){
				while(!encontrado && i<profes.size()){
					if(selected_docente.equals(profes.get(i).getApellidoP() + " " +profes.get(i).getApellidoM() + " " + profes.get(i).getNombre())){
						encontrado=true;
					}else{
						i++;
					}
					
				if(encontrado){
					
					propuestas_docente = profes.get(i).getUsuarios().get(0).getPropuestas();
					
					
				}
			}
			util.getEntityManager().close();
			pdao = null;
			System.gc();
			
			
			
		}
		}
		
		public void asignaPropuesta(){
			
			LoginController myBean2 = (LoginController) FacesContext.getCurrentInstance().getExternalContext()
		            .getSessionMap().get("pc");
			JPAUtil jpau =  new JPAUtil();
			
			
			
		
			
			myBean2.user.getPropuestas().add(selected_propuesta);
			selected_propuesta.getUsuarios().add(myBean2.user);
			
			HistorialasignaciontesiDAO dao =  new HistorialasignaciontesiDAO(jpau.getEntityManager());
			Historialasignaciontesi h =  new Historialasignaciontesi();
			h.setEvento("Asignacion");
			h.setFecha(new Date());
			h.setId(dao.listarTodos().size()+1);
			h.setPropuesta(selected_propuesta);
			h.setUsuarioId(myBean2.user.getId());
			
			selected_propuesta.getHistorialasignaciontesis().add(h);
			
			jpau.getEntityManager().getTransaction().begin();
			jpau.getEntityManager().merge(selected_propuesta);
			jpau.getEntityManager().getTransaction().commit();
			
			
			
			
			
			try{
				propuesta_asignada = myBean2.user.getPropuestas().get(0);
			}catch(java.lang.ArrayIndexOutOfBoundsException e){
				propuesta_asignada=null;
			}
			
			if(propuesta_asignada!=null){
				participante1 = myBean2.user.getAlumnos().get(0);
				for(int j=0;j<propuesta_asignada.getUsuarios().size();j++){
					if(propuesta_asignada.getUsuarios().get(j)!=myBean2.user &&
							propuesta_asignada.getUsuarios().get(j).getTipoUsuario().getId()==3){
						participante2 = propuesta_asignada.getUsuarios().get(j).getAlumnos().get(0);
						int id1=0,id2=0;
						HistorialasignaciontesiDAO da =  new HistorialasignaciontesiDAO(jpau.getEntityManager());
						List<Historialasignaciontesi> historiales = da.listarTodosxUsuario(participante1.getUsuarios().get(0)
								.getId());
						id1 = historiales.get(historiales.size()-1).getId();
						historiales = da.listarTodosxUsuario(participante2.getUsuarios().get(0).getId());
						id2 = historiales.get(historiales.size()-1).getId();
						
						if(id1<id2){
							elimina=true;
						}
					}
				}
			}
			
			jpau.getEntityManager().close();
		}
		
		public void verificaOtros(){
			
			List<Usuario> usuarios = selected_propuesta.getUsuarios();
			int i=0;
			conta=0;
			int capturados = 0 ;
			while(i<usuarios.size()){
				if(usuarios.get(i).getTipoUsuario().getId()==3){
					conta++;
					capturados =i;
				}
				i++;
				
			}	
			if(conta!=0){
				auxi = usuarios.get(capturados).getAlumnos().get(0).getNombre()+" " + usuarios.get(capturados).getAlumnos().get(0).getApellido();
			}
			
		}
		
		public void abandonaPropuesta(){
			LoginController myBean2 = (LoginController) FacesContext.getCurrentInstance().getExternalContext()
		            .getSessionMap().get("pc");
			myBean2.user.getPropuestas().remove(propuesta_asignada);
			propuesta_asignada.getUsuarios().remove(myBean2.user);
			
			JPAUtil jpau =  new JPAUtil();
			HistorialasignaciontesiDAO dao =  new HistorialasignaciontesiDAO(jpau.getEntityManager());
			Historialasignaciontesi h =  new Historialasignaciontesi();
			h.setEvento("Abandono");
			h.setFecha(new Date());
			h.setId(dao.listarTodos().size()+1);
			h.setPropuesta(propuesta_asignada);
			h.setUsuarioId(myBean2.user.getId());

			propuesta_asignada.getHistorialasignaciontesis().add(h);
			h.setPropuesta(propuesta_asignada);
			jpau.getEntityManager().getTransaction().begin();
			jpau.getEntityManager().merge(propuesta_asignada);
			jpau.getEntityManager().getTransaction().commit();
			jpau.getEntityManager().close();
			
			propuesta_asignada = null;
			participante1 = null;
			participante2 = null;
			
			
			
		}
		
		public void eliminaParticipante(){
			JPAUtil jpau =  new JPAUtil();
			
			
			HistorialasignaciontesiDAO dao =  new HistorialasignaciontesiDAO(jpau.getEntityManager());
			Historialasignaciontesi h =  new Historialasignaciontesi();
			h.setEvento("Eliminacion");
			h.setFecha(new Date());
			h.setId(dao.listarTodos().size()+1);
			h.setPropuesta(propuesta_asignada);
			h.setUsuarioId(participante2.getUsuarios().get(0).getId());
			
			propuesta_asignada.getHistorialasignaciontesis().add(h);
			
			participante2.getUsuarios().get(0).getPropuestas().remove(propuesta_asignada);
			propuesta_asignada.getUsuarios().remove(participante2.getUsuarios().get(0));
			
			
			
			jpau.getEntityManager().getTransaction().begin();
			jpau.getEntityManager().merge(propuesta_asignada);
			jpau.getEntityManager().getTransaction().commit();
			jpau.getEntityManager().close();
			
			participante2 =null;
			elimina = false;
				
		}

		public boolean isElimina() {
			return elimina;
		}

		public void setElimina(boolean elimina) {
			this.elimina = elimina;
		}
		
		
}
